package com.hsylient.javase.chapter02.demo02.demo03;

/**
 * 匿名内部类
 *
 * 最常见的一种形式莫过于在方法参数中新建一个接口对象 / 类对象，并且实现这个接口声明 / 类中原有的方法了
 * 在Thread类的构造方法中，需要传进来一个Runnable接口的实现类，通过下面的方式实现
 */
public class InnerClass {

    private Integer field1;
    public Integer field2;
    protected Integer field3;
    Integer field4;

    /**
     * 外部类无法使用匿名内部类中的属性，因为在外部调用的时候无法得知匿名内部类的类名
     * 也就无法创建匿名内部类的对象
     */
    public void getInnerClassField() {
        // System.out.println(field);
    }

    public void getOutClassField() {
        /*
         * 在这个过程中会新建一个匿名内部类对象，这个匿名内部类实现了Runnable接口并重写run方法
         * 调用这个方法的前提是：先创建外部类的对象，外部类对象一旦创建了，字段也就被实例化了，也就可以访问了
         */
        Thread thread = new Thread(new Runnable() {
            int field = 12;
            @Override
            public void run() {
                System.out.println(field1);
                System.out.println(field2);
                System.out.println(field3);
                System.out.println(field4);
            }
        });
        thread.start();
    }
}
